package com.woniuxy.rabbitmq.producterconfirm;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.ConfirmListener;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author: 15489  <br/>
 * Date: 2022/4/2:15:02  <br/>
 * Description:
 */

public class ComfirmPublishProducter {
    public static void main(String[] args) throws IOException, TimeoutException {
//        1:创建工厂:创建rabbitmq的连接对象
        ConnectionFactory factory=new ConnectionFactory();
//        2:设置连接参数
        factory.setHost("192.168.58.128"); //ip
        factory.setPort(5672);             //端口
        factory.setUsername("admin");       //账号
        factory.setPassword("admin");       //密码
        factory.setVirtualHost("/test");   // 虚拟机名字
//        3:创建连接
        Connection connection=factory.newConnection();
        System.out.println(connection);

//        4:发消息
//        4.1 创建一个通道
        Channel channel = connection.createChannel();


        //        开启confirm模式
        channel.confirmSelect();
//        添加监听器 处理没有被rabbitmq收到的消息
        channel.addConfirmListener(new ConfirmListener() {
            //            处理收到消息
//            参数一 消息id
//            参数二
            @Override
            public void handleAck(long l, boolean b) throws IOException {
                System.out.println(l+""+b);
//                通过id作为key删除对于的value
            }

            @Override
            public void handleNack(long l, boolean b) throws IOException {
                System.out.println(l+""+b);
//                重发消息
//               1 继续向该mq发送消息 建议重发的次数在三次以内
//               2 将该消息转发给另外一台mq

            }
        });

//      5:创建使用交换机
//        参数一 交换机的名字
//        参数二 交换机的类型   fanout发表订略 模式使用的交换机
        channel.exchangeDeclare("publish_exchange_a","fanout") ;
        for (int i=0;i<10;i++){
//            参数一 交换机的名字
//            参数二 ：消息队列名字
//            消息的id默认是从1开始进行编号 所以在发消息之前可以通过id作为key消息作为value存放在redis，map中
            channel.basicPublish("publish_exchange_a","",null,(i+"").getBytes());
        }
//        channel.close();
//        connection.close();

    }
}
